package network;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-01-13
 * Time: 20:21
 */


import java.io.IOException;
import java.net.*;
import java.util.Scanner;

/**  UDP版本的回显客户端 -- 用户用的
 *   UDP类型的回响反应器(回显服务器 -- Echo serve) -- 根据请求做出响应省略了"根据请求做出响应"
 */
public class UdpEchoClient {

    private DatagramSocket socket = null;

    private String serverIp = null; // 服务器IP

    private int serverPort = 0; // 服务器端口号

    /**
     * 一次完整得通信, 需要有两个 IP 以及两个端口
     * 客户端得IP操作系统是知道得
     * 客户端得 port 是系统自动分配得
     * 服务器得 IP 和 端口 也需要告诉客户端, 才能顺利把消息发给服务器
     */

    // 客户端构造器 需要绑定服务端得IP和端口号
    public UdpEchoClient(String serverIp, int serverPort) throws SocketException {
        socket = new DatagramSocket();
        this.serverIp = serverIp;
        this.serverPort = serverPort;
    }

    public void start () throws IOException {
        System.out.println("客户端启动 !");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            // 1. 从控制台读取要发送得数据
            System.out.print("> ");
            String request = scanner.next();

            // 判断是否有请求发出(即是需要发送消息还是要退出发送)
            if(request.equals("exit")) {
                System.out.println("退出客户端 !");
                break;
            }

            // 2. 构造成 UDP 请求并发送
            //    构造这个Packet得时候, 需要把serverIp和port都传过来,
            //    但那时此处IP地址需要填写得是一个32位得整数形式
            //    上述得IP地址是一个字符串, 需要用 InetAddress.getByName 来进行一个转换
            //   InetAddress为接收数据报中获取发送端主机IP地址
            //   InetAddress.getByName() -- 确定主机名称的IP地址(此处为客户端IP)
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,
                    InetAddress.getByName(serverIp), serverPort);
            // 发送以DatagramPacket打包得数据
            socket.send(requestPacket);

            // 3. 读取服务器得UDP响应,并解析 -- 做出响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);
            // 接收响应
            socket.receive(responsePacket);
            // 响应内容
            String response = new String(responsePacket.getData(), 0, responsePacket.getLength());

            // 4. 打印解析结果
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient client = new UdpEchoClient("127.0.0.1", 2048);
        client.start();
    }

}
